/**
 * 二种【防抖】的写法
 * debounce函数的目的是为了避免相同的事件触发的频率过快，即连续两次事件触发的执行时间之差不能低于某个限定值，
 * 相当于控制了事件执行的频率。像 vue 里的 watch 就适合用这个。
 *
 * 解释：由于每次触发都会执行clearTimeout，因此若前一次延迟操作没有被执行则会被自动取消，
 * 即前一次触发与后一次触发间隔时间小于规定间隔时间时前一次触发会被自动取消执行；
 */

// 防抖1 老版本
export const debounce1 = function debounce(fn, delay) {
  let last = null
  return function debounce_fn() {
    if (last) {
      clearTimeout(last) // 若此时距离上次执行的时间小于delay，就相当于取消了前一次执行
    }
    last = setTimeout(() => {
      fn.apply(this, arguments)
    }, delay) // 事件延迟执行，只有当后一次触发与当前触发≥delay时才会被执行！
  }
}


// 防抖2 ES6
export const debounce2 = (func, wait) => {
  let timeout = '';
  return (v) => {
    if (timeout) {
      clearTimeout(timeout);
    }
    timeout = setTimeout(() => {
      func(v);
    }, wait);
  }
};

/**
 * 二种【节流】的写法
 * throttle函数的目的很简单，就是在一段时间内相同的事件只处理一次，
 * 避免过快过多的执行造成程序占用内存过大而导致卡顿；实现的方式主要有两种：
 */

// 计时器方式 定一个执行的时间
export const throttle3 = (fn, delay = 600) => {
  let last = null
  return function throttle_fn() {
    if (last === null) {
      last = setTimeout(() => {
        fn.apply(this, arguments)
        last = null // 清除已执行的计时器标记
      }, delay)
    }
  }
}


// 时间戳:主要是记录上一次执行的时间戳，然后与当前时间戳进行比较，若超过指定的时间则执行一次；
export const throttle4 = function (fn, delay) {
  let last = 0 // 这样能保证第一次触发能够立即被执行
  return function throttle_fn() {
    if (Date.now() - last >= delay) {
      fn.apply(this, arguments)
      last = Date.now()
    }
  }
}


export const getEveryDayDateByBetweenDate = (start, end) => {
  let dateList = [];
  let startTime = getDate(start);
  let endTime = getDate(end);

  while ((endTime.getTime() - startTime.getTime()) >= 0) {
    let year = startTime.getFullYear();
    let month = startTime.getMonth() + 1 < 10 ? '0' + (startTime.getMonth() + 1) : startTime.getMonth() + 1;
    let day = startTime.getDate().toString().length == 1 ? "0" + startTime.getDate() : startTime.getDate();
    dateList.push({date: year + "" + month + "" + day, select: false});
    startTime.setDate(startTime.getDate() + 1);
  }
  return dateList;
}

function getDate(datestr) {
  const temp = datestr.split("-");
  return new Date(temp[0], temp[1] - 1, temp[2]);
}
